home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume6 / context < prev    next >
Encoding:
Internet Message Format  |  1986-11-30  |  5.1 KB

  1. Subject: v06i017:  context - generalized context printer (context)
  2. Newsgroups: mod.sources
  3. Approved: rs@mirror.UUCP
  4.  
  5. Submitted by: genrad!decvax!cwruecmp!ncoast!allbery (Brandon S. Allbery)
  6. Mod.sources: Volume 6, Issue 17
  7. Archive-name: context
  8.  
  9. #!/bin/sh
  10. # This is a shell archive.  Remove anything before this line,
  11. # then unpack it by saving it in a file and typing "sh file".
  12. # Contents:  README context.c
  13.  
  14. echo x - README
  15. sed 's/^XX//' > "README" <<'@//E*O*F README//'
  16. XXThe following file is my context'' program for displaying the context of
  17. XXa message of the general form
  18.  
  19. XX    <garbage> filename <garbege> linenumber <garbage>
  20.  
  21. XXSample usage:
  22.  
  23. XXScript started on Fri Jun  6 18:29:09 1986
  24. XX% grep range context.c
  25. XXint cxtrange = 3;
  26. XX        if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25)
  27. XX            cxtrange = 3;
  28. XX        lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange);
  29. XX        hilino = cxtln + cxtrange;
  30.  
  31. XX% grep -n range /dev/null context.c | context    # /dev/null forces filename
  32. XX**************
  33. XX* context.c:6:int cxtrange = 3;
  34. XX*****
  35. XX  
  36. XX  char curfile[512];
  37. XX  FILE *curfp = NULL;
  38. XX* int cxtrange = 3;
  39. XX  
  40. XX  char *gets();
  41. XX  
  42.  
  43. XX**************
  44. XX* context.c:20:        if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25)
  45. XX*****
  46. XX          exit(1);
  47. XX      }
  48. XX      if (argc == 2)
  49. XX*         if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25)
  50. XX              cxtrange = 3;
  51. XX      while (gets(context) != (char *) 0) {
  52. XX          for (cp = context; *cp != '.' && *cp != '/' && *cp != '-' && *cp != '_' && !isalnum(*cp); cp++)
  53.  
  54. XX**************
  55. XX* context.c:21:            cxtrange = 3;
  56. XX*****
  57. XX      }
  58. XX      if (argc == 2)
  59. XX          if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25)
  60. XX*             cxtrange = 3;
  61. XX      while (gets(context) != (char *) 0) {
  62. XX          for (cp = context; *cp != '.' && *cp != '/' && *cp != '-' && *cp != '_' && !isalnum(*cp); cp++)
  63. XX              if (*cp == '\0')
  64.  
  65. XX**************
  66. XX* context.c:49:        lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange);
  67. XX*****
  68. XX          if (*fcp == '\0')
  69. XX              continue;
  70. XX          cxtln = atol(fcp);
  71. XX*         lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange);
  72. XX          hilino = cxtln + cxtrange;
  73. XX          if (lolino < curln) {
  74. XX              fseek(curfp, 0L, 0);
  75.  
  76. XX**************
  77. XX* context.c:50:        hilino = cxtln + cxtrange;
  78. XX*****
  79. XX              continue;
  80. XX          cxtln = atol(fcp);
  81. XX          lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange);
  82. XX*         hilino = cxtln + cxtrange;
  83. XX          if (lolino < curln) {
  84. XX              fseek(curfp, 0L, 0);
  85. XX              curln = 0;
  86.  
  87. XX% 
  88. XXscript done on Fri Jun  6 18:29:55 1986
  89.  
  90. XXAlso useful for examining the causes of C errors (although I've received mixed
  91. XXreviews on that; seems that BSD4.2 has a smarter'' program callederrors'').
  92.  
  93. XXSimply compile context.c -- there are no V7/S5/BSD dependencies that I know
  94. XXof.  Then enjoy.
  95.  
  96. XX                    --Brandon
  97. @//E*O*F README//
  98. chmod u=rw,g=rw,o=rw README
  99.  
  100. echo x - context.c
  101. sed 's/^XX//' > "context.c" <<'@//E*O*F context.c//'
  102. XX#include <stdio.h>
  103. XX#include <ctype.h>
  104.  
  105. XXchar curfile[512];
  106. XXFILE *curfp = NULL;
  107. XXint cxtrange = 3;
  108.  
  109. XXchar *gets();
  110.  
  111. XXmain(argc, argv)
  112. XXchar **argv; {
  113. XX    char context[512], fline[512], *cp, *fcp;
  114. XX    long cxtln, lolino, hilino, curln;
  115.  
  116. XX    if (argc > 2) {
  117. XX        fprintf(stderr, "Usage: context [nlines] < listfile\n");
  118. XX        exit(1);
  119. XX    }
  120. XX    if (argc == 2)
  121. XX        if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25)
  122. XX            cxtrange = 3;
  123. XX    while (gets(context) != (char *) 0) {
  124. XX        for (cp = context; *cp != '.' && *cp != '/' && *cp != '-' && *cp != '_' && !isalnum(*cp); cp++)
  125. XX            if (*cp == '\0')
  126. XX                break;
  127. XX        if (*cp == '\0')
  128. XX            continue;
  129. XX        strcpy(fline, cp);
  130. XX        for (fcp = cp, cp = fline; *cp == '_' || *cp == '.' || *cp == '/' || *cp == '-' || isalnum(*cp); cp++, fcp++)
  131. XX            ;
  132. XX        if (*cp == '\0')
  133. XX            continue;
  134. XX        *cp = '\0';
  135. XX        if (curfp == (FILE *) 0 || strcmp(curfile, fline) != 0) {
  136. XX            if (curfp != (FILE *) 0)
  137. XX                fclose(curfp);
  138. XX            if ((curfp = fopen(fline, "r")) == (FILE *) 0) {
  139. XX                perror(fline);
  140. XX                continue;
  141. XX            }
  142. XX            strcpy(curfile, fline);
  143. XX            curln = 0;
  144. XX        }
  145. XX        for (; *fcp != '\0' && !isdigit(*fcp); fcp++)
  146. XX            ;
  147. XX        if (*fcp == '\0')
  148. XX            continue;
  149. XX        cxtln = atol(fcp);
  150. XX        lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange);
  151. XX        hilino = cxtln + cxtrange;
  152. XX        if (lolino < curln) {
  153. XX            fseek(curfp, 0L, 0);
  154. XX            curln = 0;
  155. XX        }
  156. XX        if (cxtln == curln) {        /* already shown */
  157. XX            printf("*****\n* %s\n*****\n\n", context);
  158. XX            continue;
  159. XX        }
  160. XX        printf("**************\n* %s\n*****\n", context);
  161. XX        while (fgets(fline, 512, curfp) != (char *) 0 && ++curln < lolino)
  162. XX            ;
  163. XX        if (curln < lolino)
  164. XX            continue;
  165. XX        out(fline, curln == cxtln);
  166. XX        while (fgets(fline, 512, curfp) != (char *) 0 && ++curln <= hilino)
  167. XX            out(fline, curln == cxtln);
  168. XX        putchar('\n');
  169. XX    }
  170. XX}
  171.  
  172. XXout(s, flg)
  173. XXchar *s; {
  174. XX    printf("%c %s", (flg? '*': ' '), s);
  175. XX}
  176. @//E*O*F context.c//
  177. chmod u=rw,g=rw,o=rw context.c
  178.  
  179. echo Inspecting for damage in transit...
  180. temp=/tmp/sharin$$; dtemp=/tmp/sharout$$
  181. trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
  182. cat > $temp <<\!!!
  183.       81     362    2154 README
  184.       74     291    1772 context.c
  185.      155     653    3926 total
  186. !!!
  187. wc  README context.c | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
  188. if test -s $dtemp
  189. then echo "Ouch [diff of wc output]:" ; cat $dtemp
  190. else echo "No problems found."
  191. fi
  192. exit 0
  193.